package com.sc.nft.dao;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sc.nft.entity.DaoPledgeUserPeriods;
import com.sc.nft.mapper.DaoPledgeUserPeriodsMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * dao质押活动用户质押期数表(sc_dao_pledge_user_periods)数据DAO
 *
 * @author jinpinhai
 * @since 2024-11-26 17:14:03
 */
@Slf4j
@Repository
public class DaoPledgeUserPeriodsDao extends ServiceImpl<DaoPledgeUserPeriodsMapper, DaoPledgeUserPeriods> {


    /**
     * 更新结算时间
     * @param periodIds 期数id
     * @param date 结算时间
     * @return 更新条数
     */
    public Integer updateSettleTime(List<Long> periodIds, Date date) {
        return baseMapper.updateSettleTime(periodIds, date);
    }


    /**
     * 参与记录分页
     * @param page 分页数据
     * @param userId 用户id
     * @param daoId daoId
     * @return DaoPledgeUserPeriods
     */
    public Page<DaoPledgeUserPeriods> pagePeriodsByUserId(Page<DaoPledgeUserPeriods> page, Long userId, Long daoId) {
        LambdaQueryWrapper<DaoPledgeUserPeriods> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DaoPledgeUserPeriods::getUserId, userId);
        wrapper.eq(DaoPledgeUserPeriods::getDaoId, daoId);
        wrapper.orderByDesc(DaoPledgeUserPeriods::getCreateTime);
        return page(page, wrapper);
    }

    /**
     * 根据期数获取用户参与期数
     * @param pledgeId 质押id
     * @param periods 期数
     * @return DaoPledgeUserPeriods
     */
    public List<DaoPledgeUserPeriods> listPeriodsByPeriods(Long pledgeId, Integer periods) {
        LambdaQueryWrapper<DaoPledgeUserPeriods> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DaoPledgeUserPeriods::getPledgeId, pledgeId);
        wrapper.eq(DaoPledgeUserPeriods::getPeriods, periods);
        return list(wrapper);
    }

    /**
     * 获取未结算完成的用户质押记录
     * @param pledgeId 质押id
     * @return DaoPledgeUserPeriods
     */
    public List<DaoPledgeUserPeriods> listByPledgeIdAndStatus(Long pledgeId) {
        LambdaQueryWrapper<DaoPledgeUserPeriods> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DaoPledgeUserPeriods::getPledgeId, pledgeId);
        wrapper.eq(DaoPledgeUserPeriods::getSettleStatus, Boolean.FALSE);
        return list(wrapper);
    }

    /**
     * 获取待结算的用户质押记录
     * @param date 日期
     * @return DaoPledgeUserPeriods
     */
    public List<DaoPledgeUserPeriods> listWaitSettle(Date date) {
        LambdaQueryWrapper<DaoPledgeUserPeriods> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DaoPledgeUserPeriods::getSettleStatus, Boolean.FALSE);
        wrapper.lt(DaoPledgeUserPeriods::getSettleTime, date);
        return list(wrapper);
    }


    public IPage<DaoPledgeUserPeriods> page(Page page, Long daoId, List<Long> pledgeIdList, Long userId, Integer periods) {
        LambdaQueryWrapper<DaoPledgeUserPeriods> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(Objects.nonNull(daoId), DaoPledgeUserPeriods::getDaoId, daoId);
        wrapper.in(CollectionUtil.isNotEmpty(pledgeIdList), DaoPledgeUserPeriods::getPledgeId, pledgeIdList);
        wrapper.eq(Objects.nonNull(userId), DaoPledgeUserPeriods::getUserId, userId);
        wrapper.eq(Objects.nonNull(periods), DaoPledgeUserPeriods::getPeriods, periods);
        wrapper.orderByDesc(DaoPledgeUserPeriods::getCreateTime);
        return page(page, wrapper);
    }

}